package ModulHåndtering;

import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import jssc.SerialPort;
import static jssc.SerialPort.MASK_RXCHAR;
import jssc.SerialPortEvent;
import jssc.SerialPortEventListener;
import jssc.SerialPortException;

public class ModulFPGA extends Modul {

    public ModulFPGA(SerialPort p) {
        port = p;       //Giv den porten til generel brug i klassen
        navn = "ModulFPGA";

        //Sæt navne for de tilgængelige indstillinger
        indstillingerList = new ArrayList<>();
        indstillingerList.add("Tal på skærm");
        indstillingerList.add("Dørkilesekunder");

        //Sæt initial values for indstillingerne
        indstillingerVærdiList = new ArrayList<>();
        indstillingerVærdiList.add(5);
        indstillingerVærdiList.add(10);

        //Tilføj de relevante sensorer
        sensorList = new ArrayList<>();
        for (int i = 0; i < 4; i++) {
            sensorList.add(new SensorOnOff());
        }
        sensorList.add(new SensorTemperatur());

        //Tilføj Controllers
        kontrollerList = new ArrayList<>();
        kontrollerList.add(new ControllerDør());
        kontrollerList.add(new ControllerSkærm());

        try {
            port.addEventListener(new SerialPortEventListener() {

                @Override
                public void serialEvent(SerialPortEvent serialPortEvent) {
                    try {
                        if (port.getInputBufferBytesCount() > 8) {
                            serielDataEvent();
                        }
                    } catch (SerialPortException ex) {
                        Logger.getLogger(ModulMC.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }, MASK_RXCHAR);
        } catch (SerialPortException ex) {
            System.err.println(ex);
        }

    }

    @Override
    public void serielDataEvent() {
        ArrayList<String> input = formatData(læsDataSerial());
        for (String s : input) {
            if (s != null) {
                switch (s.substring(0, 2)) {
                    case "S1":
                        switch (s.substring(2)) {
                            case "_On1":
                                sensorList.get(0).addData(1);
                                skrivSerial(kontrollerList.get(0).overSætCmd("O1"));
                                break;
                            case "Off1":
                                sensorList.get(0).addData(0);
                                skrivSerial(kontrollerList.get(0).overSætCmd("C1"));
                                break;
                        }
                        break;
                    case "S2":
                        switch (s.substring(2)) {
                            case "_On2":
                                sensorList.get(1).addData(1);
                                skrivSerial(kontrollerList.get(0).overSætCmd("O1"));
                                break;
                            case "Off2":
                                sensorList.get(1).addData(0);
                                skrivSerial(kontrollerList.get(0).overSætCmd("C1"));
                                break;
                        }
                        break;
                    case "S3":
                        switch (s.substring(2)) {
                            case "_On3":
                                sensorList.get(2).addData(1);
                                skrivSerial(kontrollerList.get(0).overSætCmd("O1"));
                                break;
                            case "Off3":
                                sensorList.get(2).addData(0);
                                skrivSerial(kontrollerList.get(0).overSætCmd("C1"));
                                break;
                        }
                        break;
                    case "SM":
                        switch (s.substring(2)) {
                            case "_OnM":
                                sensorList.get(3).addData(1);
                                skrivSerial(kontrollerList.get(0).overSætCmd("O1"));
                                break;
                            case "OffM":
                                sensorList.get(3).addData(0);
                                skrivSerial(kontrollerList.get(0).overSætCmd("C1"));
                                break;
                        }
                        break;
                    case "ST":
                        int temperatur = 0;
                        try {
                            temperatur = Integer.parseInt(s.substring(4), 16);

                        } catch (NumberFormatException e) {
                        }
                        temperaturStyring(temperatur);
                        formatter(4, temperatur + "");
                        break;
                }
            }
        }
    }

    private void temperaturStyring(int temperatur) {
        System.out.println("" + temperatur);
        if (temperatur > indstillingerVærdiList.get(0)) {
            skrivSerial(kontrollerList.get(1).overSætCmd(temperatur + ""));
        } else {
            skrivSerial(kontrollerList.get(1).overSætCmd(indstillingerVærdiList.get(0) + ""));
        }
    }
}
